package main

import "fmt"

/* [序] recover(),panic(v),defer结合 */
/**
特性：
1. recover() 只能恢复当前函数级或者当前函数调用函数中的 panic，恢复后，调用当前函数级别结束，
但是调用当前函数的函数可以继续执行
2. panic 会一直向上传递，如果没有recover()，则表示终止程序；
但是碰到了recover，recover所在级别的函数会接收panic，向上传递结束
3. recover() 必须写到defer里面 ，否则遇见panic(v)，defer外部的recover()无法执行
*/
func main() {
	fmt.Println("程序开始……")
	demo01()
	fmt.Println("程序结束……")
}

func demo01() {
	fmt.Println("demo01 上半部分")
	demo02()
	fmt.Println("demo01 下半部分")
}
func demo02() {
	defer func() {
		recover() //此处进行恢复,当前层执行结束
	}()
	fmt.Println("demo02 上半部分")
	demo03()
	fmt.Println("demo02 下半部分")
}
func demo03() {
	fmt.Println("demo03 上半部分")
	panic("在demo03 出现了panic")
	fmt.Println("demo03 下半部分")
}
